######################################################################
# File: net/telnet.py                      Part of Python MUD Server #
#                                                                    #
# Copyright (C) 2010 by Joachim Pileborg <arrow@pileborg.org>.       #
# All rights reserved.                                               #
#                                                                    #
# Redistribution and use in source and binary forms, with or without #
# modification, are permitted provided that the following conditions #
# are met:                                                           #
#                                                                    #
#   o Redistributions of source code must retain the above copyright #
#     notice, this list of conditions and the following disclaimer.  #
#   o Redistributions in binary form must reproduce the above        #
#     copyright notice, this list of conditions and the following    #
#     disclaimer in the documentation and/or other materials         #
#     provided with the distribution.                                #
#                                                                    #
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND             #
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,        #
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF           #
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE           #
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS  #
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,#
# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,           #
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR #
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY       #
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR     #
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF #
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF    #
# SUCH DAMAGE.                                                       #
######################################################################

from pms import settings
from pms import log
from pms.net.server import PmsServerFactory

from twisted.conch.telnet import TelnetTransport, StatefulTelnetProtocol
from twisted.internet.error import ConnectionDone
from twisted.internet import reactor
from twisted.internet.protocol import ServerFactory

######################################################################

# TODO: Add more inheritance, to handle generic connection handling?
#       Like generic input handling, etc.
class TelnetProtocol(StatefulTelnetProtocol):

    def connectionMade(self):
        StatefulTelnetProtocol.connectionMade(self)
        self.state = 'default'
        self.transport.factory.addConnection(self)
        self.transport.write("Welcome!\r\n")
        log.net('New connection from ' + self.transport.getPeer().host)

    def connectionLost(self, reason):
        if reason.check(ConnectionDone):
            print 'Connection to', self.transport.getPeer().host, 'closed be peer'
        else:
            print 'Connection to', self.transport.getPeer().host, 'lost, reason is:'
            reason.printDetailedTraceback()
        StatefulTelnetProtocol.connectionLost(self, reason)

    ##################################################################
    # State functions

    def telnet_default(self, line):
        if line == 'quit':
            # TODO: Add a 'reason' that means "closed because user asked me to"
            self.transport.loseConnection()
        else:
            self.sendLine('You wrote %r' % line)

######################################################################

class TelnetProtocolFactory(PmsServerFactory):
    port     = settings.DEFAULT_TELNET_PORT
    name     = 'telnet'
    protocol = lambda self: TelnetTransport(TelnetProtocol)

######################################################################
